import { Message } from 'element-ui'

export default class SocketService {
    /**
     * 单例
     */
    static instance = null
    static get Instance() {
        if (!this.instance) {
            this.instance = new SocketService()
        }
        return this.instance
    }

    // 和服务端连接的socket对象
    ws = null

    // 存储回调函数
    callBackMapping = {}

    // 标识是否连接成功
    connected = false

    // 记录重试的次数
    sendRetryCount = 0

    // 重新连接尝试的次数
    connectRetryCount = 0

    //  定义连接服务器的方法
    connect() {
            // 连接服务器
            if (!window.WebSocket) {
                return console.log('您的浏览器不支持WebSocket')
            }

            this.ws = new WebSocket(`ws://${process.env.VUE_APP_BASE_URL}logic/ws`)

            // 连接成功的事件
            this.ws.onopen = () => {
                    console.log('连接服务端成功')
                    this.connected = true
                        // 重置重新连接的次数
                    this.connectRetryCount = 0
                }
                //连接发生错误的回调方法
            this.ws.onerror = function() {
                console.log("WebSocket连接发生错误");
                // this.connected = false
                // this.connectRetryCount++
                //     setTimeout(() => {
                //         this.connect()
                //     }, 500 * this.connectRetryCount)
            };
            //   // 1.连接服务端失败
            //   // 2.当连接成功之后, 服务器关闭的情况(连接失败重连)
            // this.ws.onclose = () => {
            //         console.log('连接服务端失败')
            //         this.connected = false
            //         this.connectRetryCount++
            //             setTimeout(() => {
            //                 this.connect()
            //             }, 500 * this.connectRetryCount)
            //     }
            // 得到服务端发送过来的数据
            this.ws.onmessage = msg => {
                    this.callBackMapping = {}
                    console.log('从服务端获取到了数据' + msg.data)
                        // if (this.callBackMapping) {
                        //     this.callBackMapping.call(this, msg.data)
                        // }
                        // Message({
                        //     type: "success",
                        //     message: "此节点已经在断点集合",
                        // });
                    this.callBackMapping = msg.data
                }
                //监听窗口关闭事件，当窗口关闭时，主动去关闭websocket连接，防止连接还没断开就关闭窗口，server端会抛异常。
            window.onbeforeunload = function() {
                this.ws.close();
            }
        }
        // 回调函数的注册
    registerCallBack(callBack) {
        console.log('回调函数的注册', callBack)
            // this.callBackMapping = callBack
    }

    // 取消某一个回调函数
    unRegisterCallBack(callBack) {
        console.log('取消某一个回调函数', callBack)
        this.callBackMapping = null
    }

    // 发送数据的方法
    send(data) {
            // 发送数据时清空上次的连接的数据
            this.callBackMapping = {}
            console.log('发送的数据', data);
            // 判断此时此刻有没有连接成功
            if (this.connected) {
                this.sendRetryCount = 0
                this.ws.send(data)
            } else {
                this.sendRetryCount++
                    setTimeout(() => {
                        this.send(data)
                    }, this.sendRetryCount * 500)
            }
        }
        // 关闭连接
    onClose() {
        console.log('关闭连接');
        this.ws.close()
        this.connected = false
        Message({
            type: "success",
            message: "执行完成，断开连接",
        });
    }
}